/** 
* @Title: ReflectDemo2.java 
* @Package com.lh.reflection 
* @Description: TODO
* @author Liu 
* @date 2018年1月23日 下午4:32:04 
* @version V1.0 
*/
package com.lh.reflection;

import java.lang.reflect.Constructor;

import com.lh.reflection.bean.Person;

/**
 * @ClassName: ReflectDemo2
 * @Description: 获取Class中的构造函数
 * @author Liu
 * @date 2018年1月23日 下午4:32:04
 * 
 */
public class ReflectDemo2 {
	public static void main(String[] args) throws Exception {
		// createNewObject();
		createNewObject2();
	}

	/**
	 * @throws Exception * 
	 * @Title: createNewObject2 
	 * @Description:
	 * 反射实例化有参对象 
	 * @param 
	 * @return void 
	 * @throws
	 */
	private static void createNewObject2() throws Exception {
//		com.lh.reflection.bean.Person p = new com.lh.reflection.bean.Person("小明", 20);

		/***
		 * 当获取指定名称对应类中所体现的对象时，而该对象初始化不使用空参构造函数怎么办呢？
		 * 既然是通过指定的构造函数进行对象的初始化，所以应该先获取该构造函数，通过字节码文件对象即可完成。
		 * 该方法是getConstructor(Class<T>.. paramsType)
		 * 
		 */
		String name = "com.lh.reflection.bean.Person";

		// 寻找该类名称字节码文件 ，并加载至内存，生成Class对象
		Class<Person> clazz = (Class<Person>) Class.forName(name);

		// 获取指定的构造器对象
		Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);

		// 通过构造器Constructor类中的newInstance()方法进行初始化
		Person person = constructor.newInstance("小明", 20);

	}

	/***
	 * * @Title: createNewObject 
	 * @Description: 反射实例化无参对象 
	 * @param 
	 * @throws
	 * Exception 
	 * @return void 
	 * @throws
	 */
	public static void createNewObject() throws Exception {
		// 早期：
		// new 的时候，先根据被new的类的名称寻找该类的字节码文件，加载至内存，
		// 并创建该字节码文件对象，然后创建该字节码文件对应的Person对象。
		// com.lh.reflection.bean.Person p = new
		// com.lh.reflection.bean.Person();

		// 现在：
		String name = "com.lh.reflection.bean.Person";

		// 寻找该类名称字节码文件 ，并加载至内存，生成Class对象
		Class<Person> clazz = (Class<Person>) Class.forName(name);
		// 如何产生该类的对象呢？
		// 相当于调用Person类中的无参构造方法
		Person person = clazz.newInstance();
	}
}
